home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / comms / other / dwarfx-tng / dwarfx / dwarfx.amirx < prev    next >
Text File  |  1999-04-19  |  46KB  |  14 lines

  1. /* DWaRFx.AmIRX Main CONTROL FILE v2.3a
  2. \\ $VER: |DWaRFx-TNG| 2.5 (28.12.97) By Gareth Murfin and David Newton!
  3. // This is the main control arexx script for |DWaRFx-TNG| to use with AmIRC.
  4. \\
  5. // Usage: DWaRFx.AmIRX [host]
  6. \\        Or run from within AmIRC (it should be called by Connected.AmIRX).
  7. //        Or double click on the DWaRFx.Exe file icon.
  8. \\
  9. //
  10. \\ See the DOCS for more info.
  11. */
  12. Parse Arg args .;Options Results;If Pos("AMIRC.",Upper(args))=0 Then envadr=Address();Else envadr=Upper(Strip(args));Call SETUP;If Left(envadr,hostlen)~=host Then Call FIND_PORT;If envadr="" Then Exit;envnum=Substr(envadr,hostlen+1);If Getclip('DFx.'envnum)="Y" Then Call ERR(1);Call Setclip('DFx.'envnum,"Y");Call Setclip('DFxTIME.'envnum,Time());Address Value(envadr);If ~Show(L,'rexxsupport.library') Then;Do;If ~Addlib('rexxsupport.library',0,-30,0) Then;Do;"Echo "dfxname||d2c(2)"Error:"d2c(2)" Unable to open rexxsupport.library!";Exit;End;End;Signal On SYNTAX;chanmax=0;Call CONFIG_SETUP();'IsConnected';Do While RC~=0&Show('P',envadr);Call Delay(50);'IsConnected';End;If ~Show('P',envadr) Then Call REMOVE;Call Delay(60);'Echo 'dfxname' 'dwarfx' Is now running!';'Echo 'dfxname' Type /DW? to get a list of 'dwarfx' commands.';If c_protflood=1 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFPRoT.DWaRFx 'envadr' 'c_silence' 'c_protclock' 'c_protctcp' 'c_protpriv' 'c_protchan' 'c_protnick' 'c_protclone;'GetMyNick';znick=result;mnick=Upper(znick);'GetAwayState';If rc=0 Then meaway=0;Else meaway=1;metime=0;'GetServerName';myserver=Upper(result);Call NICKLIST;/* 'GetUsers';'GetUserstate 'Find(Upper(result),mnick);If RC~=1 Then 'Echo P=ERR No-Op err!' */;Call MAIN;Call REMOVE;/* Flood Protection NOT IMPLEMENTED IN V2.5 SORRY!!!! 
  13. \\If c_protflood=1 Then "RAW NOTICE "znick" :%FLOOD PROTECTION OFF"
  14. */;Call CONFIG_REMOVE();EXIT;URLSCAN:;mess=Upper(line.rest);hpos=Pos(urlpos,mess);Do While hpos~=0;hend=Pos(' ',line.rest,hpos);If hend=0 Then hend=Length(line.rest)+1;hstr=Substr(line.rest,hpos,hend-hpos);If c_urlcatch>1 Then;If Show('p',c_urlport) Then;Do;Interpret 'Address 'c_urlport' c_urlcomm hstr';End;If c_urlcatch=1|c_urlcatch=3 Then Writeln(URL,hstr);hpos=Pos(urlpos,mess,hend);End;Return;ADDLOG:;Parse Arg amess;If unick=mnick Then Return;atime=GETDELAY(metime);"RAW NOTICE "unick" :I've been away for "atime". Your message has been logged.";Writeln(LOG,unick" "Time()" "amess);Return;MAIN:;notdone=1;Do While notdone=1;'GetLine';If line="" Then Break;com=Find(coms,line.command);If com=0 Then Iterate;npos=pos("!",line.prefix)-1;If npos>0 Then nnick=Substr(line.prefix,1,npos);zchannel=line.dest;unick=Upper(nnick);If com>4 Then routine='COMMAND'||com;Else;Do;type=Pos(Substr(line.rest,2,1),scan);routine='ROUTINE'||type;End;Interpret 'Call' routine;If c_urlcatch>0 Then Call URLSCAN;End;Return;ROUTINE0:;/* just a normal line, check for wordkick */;uchannel=Upper(zchannel);tmp=Find(c_wordchan,uchannel);If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick line.rest;If meaway=1&c_awaylog=1&uchannel=mnick Then Call ADDLOG(Substr(line.rest,2));If c_wordkick=0|(tmp=0&c_wordkick=2)|(tmp~=0&c_wordkick=3) Then Return;nkick=0;mess=Upper(line.rest);tmp=Words(c_words);Do wloop=1 To tmp;nkick=Pos(Word(c_words,wloop),mess);If nkick>0 Then Leave;End;ctmp=Find(uchans,uchannel);If nkick=0|Left(ochan.ctmp,1)='0' Then Return;/* now check for warnings against nick and then warn/kick */;tmp1=Find(lchan.ctmp,unick);If tmp1=0 Then Return;If Substr(tchan.ctmp,tmp1,1)=0 Then Call TEST_USER(ctmp,tmp1);If Substr(bchan.ctmp,tmp1,1)>3 Then Return;tmp=Substr(wchan.ctmp,tmp1,1);If tmp<c_wordwarn Then;Do;tmp=tmp+1;wchan.ctmp=Overlay(tmp,wchan.ctmp,tmp1);If tmp=c_wordwarn then tmp=tmp' 'bold2'|FINAL WARNING|'bold2;'SAY /Notice 'zchannel' 'dwarfx' Swear word warning #'tmp' - 'nnick;If c_deop=1&Substr(ochan.ctmp,tmp1,1)='1' Then 'RAW MODE 'zchannel' -o 'nnick;End;Else;Do;If c_wordmode=1 Then Call KICK(unick,zchannel,swearword);Else Call KICK_BAN(unick,zchannel,swearword);End;Return;ROUTINE1:;/* Decode 1 (Mess,Topic) - Cybeonix */;atype=1;etype=10;emess=Substr(line.rest,3);ROUTINE2:;/* Decode 2 (Mess,Topic) - MCF */;If mnick=unick Then Return;If type=2 Then;Do;atype=2;etype=Substr(line.rest,3,1);emess=Substr(line.rest,4);End;If etable.etype="" Then Return;mess="";emess=Reverse(Translate(emess,atable.atype,etable.etype));Do While emess~="";Parse Value emess With wrd1 wrd2 emess;mess=mess wrd1 Reverse(wrd2);End;mess=Strip(mess,'L');If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess;Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;If meaway=1&c_awaylog=1&Upper(zchannel)=mnick Then Call ADDLOG(mess);If c_speak=1&Left(mess,1)='@' Then;Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick mess;Return;ROUTINE3:;/* Decode 2 (Mess,Topic) - DFX */;If mnick=unick Then Return;emess=Reverse(Substr(line.rest,4));etype=Substr(line.rest,3,1);If etype='+' Then ekey=Upper(line.dest);Else ekey=c_mykey;km=1;kp.1=72;Do While ekey~="";ch=c2d(Substr(ekey,1,1));ekey=Delstr(ekey,1,1);If ch>112 Then ch=ch-150;If ch<32 Then ch=ch+70;kp.km=ch;km=km+1;End;kn=1;mess="";Do While emess~="";etmp=c2d(Left(emess,1))-kp.kn;If etmp<0 Then etmp=256+etmp;mess=mess||d2c(etmp);emess=Delstr(emess,1,1);kn=kn+1;If kn>=km Then kn=1;End;mess=Reverse(mess);If Word(mess,1)='DFx' Then;Do;mess=Subword(mess,2);If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess;Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;End;If meaway=1&c_awaylog=1&Upper(zchannel)=mnick Then Call ADDLOG(mess);If c_speak=1&Left(mess,1)='@' Then;Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick mess;Return;ROUTINE4:;/* Decode 3 (Mess,Topic) - SoundLeech */;If Word(line.rest,1)~=':[UTC234]:'|mnick=unick Then Return;Parse Value line.rest With ':[UTC234]:' emess;mess="";emess=Substr(Strip(emess),2);emess=Delstr(emess,Length(emess),1);ln=Length(emess);Do loop=1 To ln;ch=c2d(substr(emess,loop,1));If ch>128 Then ch=ch-128;mess=mess||d2c(ch);End;mess=Strip(mess,'L');If com<3 Then 'Echo P='bold1'«DFx_Decode» 'bold2'*TOPIC:'bold2' 'mess;Else 'Echo P='bold1'«DFx_Decode» 'bold2||nnick':'bold2' 'mess;If meaway=1&c_awaylog=1&Upper(zchannel)=mnick Then Call ADDLOG(mess);If c_speak=1&Left(mess,1)='@' Then;Do;mess=Substr(mess,2);Call DECODE_SPEAK;End;If c_speak=2 Then Address Command 'Run >NIL: 'sayname nnick mess;Return;ROUTINE5:;If com~=3 Then Return;/* CTCP COMMAND */;Parse Value line.rest With comc misc;comc=Upper(Substr(comc,3));misc=Strip(Delstr(misc,Length(misc)));If misc="" Then comc=Left(comc,Length(comc)-1);tmp2=Find(c_ctcpcom,comc);If tmp2~=0&c_ctcpnum.tmp2>0 Then;Do;If c_select=1 Then tmp3=Random(1,c_ctcpnum.tmp2);Else tmp3=c_ctcpnxt.tmp2;c_ctcpnxt.tmp2=c_ctcpnxt.tmp2+1;If c_ctcpnxt.tmp2>c_ctcpnum.tmp2 Then c_ctcpnxt.tmp2=1;mess=comc' 'dwarfx' 'MPARSE(Strip(c_ctcp.tmp2.tmp3,'B'));tmp2=Pos(ecode,mess);tmp3=Length(mess)-1;Do While tmp2~=0&tmp2~=tmp3;mess=Insert(comc' 'dwarfx' ',mess,tmp2+1);tmp2=Pos(ecode,mess,tmp2+2);End;Call MSEND(nnick,4,mess);End;Else;Do;/* Now search for built in CTCP commands */;tmp2=Find(mainctcp,comc);If tmp2>5 Then;Do;routine='CTCPMSG'||tmp2;Interpret 'Call' routine;End;Else If tmp2=0 Then Call SEND(nnick,4,'ERRMSG 'comc' 'dwarfx' :Unknown Query!');End;Return;ROUTINE6:;/* '%' Control Commands */;If unick~=mnick Then Return;Call Setclip('DFxTIME.'envnum,Time());Parse Value line.rest With ':%'mycom opts;com=Find(mycoms,Upper(mycom));routine='MASTER'||com;If com>0 Then Interpret 'Call' routine;Return;ROUTINE7:;/* '!'<Nick> <SoundFile> Request */;If Upper(Word(Substr(line.rest,3),1))~=mnick Then Return;If c_autosend=1 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFSoUNd.DWaRFx 'envadr' 'unick' 'c_drawer' 'Word(line.rest,2);Else Call SEND(nnick,4,'ERRMSG GETSOUND 'dwarfx' :'znick' has autosend turned off.');Return;ROUTINE8:;/* @ Speech */;If c_speak~=1 Then Return;mess=Substr(line.rest,3);If meaway=1&c_awaylog=1&Upper(zchannel)=mnick Then Call ADDLOG('@'mess);DECODE_SPEAK:;If Left(mess,1)='@' Then;Do;mess=Substr(mess,2);If Upper(Word(mess,1))=mnick Then mess=SubWord(mess,2);Else mess="";End;If mess~="" Then Address Command 'Run >NIL: 'sayname nnick': 'mess;Return;COMMAND5:;/* Join, check for auto greet/op or wordnick kick */;zchannel=Substr(zchannel,2);uchannel=Upper(zchannel);clist=Find(uchans,uchannel);If clist=0&mnick=unick Then;Do;chanmax=chanmax+1;nchans=nchans' 'zchannel;uchans=uchans' 'uchannel;fchan.chanmax=0;lchan.chanmax=mnick;ochan.chanmax='0';wchan.chanmax='0';bchan.chanmax='7';tchan.chanmax='1';jctmp=Find(c_gchans,uchannel);If c_greets.jctmp.0~=0 Then gchan.chanmax=jctmp;Else gchan.chanmax=-1;jctmp=Find(c_gdchans,uchannel);gdchan.chanmax=c_gdactive.jctmp;If Word(coms,Words(coms))~='353' Then coms=coms' 353';jctmp=Find(c_joinchans,uchannel);If c_joinmsg.jctmp.0~=0 Then Call CHAN_MSG(jctmp,zchannel);End;Else;Do;lchan.clist=lchan.clist' 'unick;wchan.clist=wchan.clist||'0';ochan.clist=ochan.clist||'0';bchan.clist=bchan.clist||'0';tchan.clist=tchan.clist||'1';oldclist=clist;End;If unick=mnick Then Return;If c_wordkick>0 Then Call CHECK_NICK();Else nkick=0;If nkick=0 Then;Do;Call AUTO_FRIEND();If gchan.oldclist~=-1 Then Call CHAN_GREET(nnick,Word(nchans,oldclist),gchan.oldclist);End;Return;COMMAND6:;/* Nick change, store new nick, and check for wordnick kick */;ynick=Substr(line.dest,2);xnick=Upper(ynick);Do clist=1 To chanmax;tmp=Find(lchan.clist,unick);If tmp~=0 Then;Do;lchan.clist=Insert(xnick' ',Delword(lchan.clist,tmp,1),Wordindex(lchan.clist,tmp)-1);tchan.clist=Overlay('1',tchan.clist,tmp);tmp2=Substr(bchan.clist,tmp,1);If tmp2>3 Then tmp2=tmp2-4;If tmp2<1 Then;Do;nfound=CHK_FRIEND(xnick);If nfound>0 Then;Do;tmp2=Word(c_ops.nfound,2);If Left(tmp2,1)~='O' Then bchan.clist=Overlay('1',bchan.clist,tmp);Else bchan.clist=Overlay('3',bchan.clist,tmp);End;End;tmp2=Substr(bchan.clist,tmp,1);If tmp2<4 Then If CHK_BOT(xnick)~=0 Then bchan.clist=Overlay(tmp2+4,bchan.clist,tmp);End;End;If mnick=unick Then;Do;mnick=xnick;znick=ynick;End;unick=xnick;nnick=ynick;If c_wordkick>0 Then Call CHECK_NICK();Return;COMMAND7:;/* QUIT */;Do clist=1 To chanmax;tmp=Find(lchan.clist,unick);If tmp~=0 Then;Do;If mnick=unick Then notdone=0;Else;Do;lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);bchan.clist=Delstr(bchan.clist,tmp,1);tchan.clist=Delstr(tchan.clist,tmp,1);End;End;End;Return;COMMAND8:;/* PART */;clist=Find(uchans,Upper(zchannel));tmp=Find(lchan.clist,unick);If tmp=0 Then Return;If mnick=unick Then Call KILL_CHANNEL(clist);Else;Do;lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);bchan.clist=Delstr(bchan.clist,tmp,1);tchan.clist=Delstr(tchan.clist,tmp,1);End;Return;COMMAND9:;/* KICK */;clist=Find(uchans,Upper(zchannel));knick=Upper(Word(line.dest' 'line.rest,2));tmp=Find(lchan.clist,knick);If tmp=0 Then Return;If mnick=knick Then;Do;If c_kicklog=1&unick~=mnick Then;Do;'Userhost 'unick;utmp=unick'!'result;Writeln(KCK,utmp" "zchannel" "Time()" "Substr(line.rest,Pos(':',line.rest)));End;Call KILL_CHANNEL(clist);End;Else;Do;lchan.clist=Strip(Delword(lchan.clist,tmp,1));wchan.clist=Delstr(wchan.clist,tmp,1);ochan.clist=Delstr(ochan.clist,tmp,1);bchan.clist=Delstr(bchan.clist,tmp,1);tchan.clist=Delstr(tchan.clist,tmp,1);End;Return;COMMAND10:;/* MODE */;Parse Upper Value line.rest With opts tmps;clist=Find(uchans,Upper(zchannel));opts=Strip(opts);If clist=0 Then Return;/* 'echo p=test |'uchans'|'clist'|'bchan.clist'|'lchan.clist'|'unick */;tmp2=Find(lchan.clist,unick);If tmp2~=0 Then;Do;If Substr(tchan.clist,tmp2,1)=0 Then Call TEST_USER(clist,tmp2);tmp2=Substr(bchan.clist,tmp2,1);End;Else tmp2=7;If tmp2>3 Then;Do;tmp2=tmp2-4;isbot=1;End;else isbot=0;If tmp2=1|tmp2=3 Then isfr=1;else isfr=0;Do While tmps~="";Parse Value tmps With tmp1 tmps;opt1=Left(opts,2);opts=Delstr(opts,1,2);tmp2=Find(lchan.clist,Strip(tmp1));If opt1="+O" Then;Do;ochan.clist=Overlay('1',ochan.clist,tmp2);If gdchan.clist=0 Then Iterate;If unick~=mnick&Left(ochan.clist,1)~=0 Then;Do;If (c_guardm=2)|(c_guardm=1&isfr=0) Then;Do;If Substr(tchan.clist,tmp2,1)=0 Then Call TEST_USER(clist,tmp2);tmp3=Substr(bchan.clist,tmp2,1);If tmp3>3 Then;Do;tmp3=tmp3-4;isbot1=1;End;Else isbot1=0;If isbot1=0&tmp3~=3 Then 'RAW MODE 'zchannel' -o 'tmp1;If (c_guardt=0)|(c_guardt=1&isfr~=0) Then Iterate;If isbot=0 Then 'RAW MODE 'zchannel' -o 'nnick;End;End;End;If opt1="-O" Then;Do;ochan.clist=Overlay('0',ochan.clist,tmp2);If unick~=mnick&unick~=tmp1 Then;Do;If Substr(tchan.clist,tmp2,1)=0 Then Call TEST_USER(clist,tmp2);tmp3=Substr(bchan.clist,tmp2,1);If tmp3>3 Then tmp3=tmp3-4;If Left(ochan.clist,1)=0 Then Iterate;If c_protect=1&tmp3>1 Then 'RAW MODE 'zchannel' +o 'tmp1;If c_revenge>0&tmp3>0 Then;Do;If isbot=1 Then Iterate;If isfr=1&c_revenge=2 Then Iterate;'RAW MODE 'zchannel' -o 'nnick;End;End;End;End;Return;COMMAND11:;/* INVITE */;If c_join=1&chanmax<c_maxjoin Then 'Say /Join 'Word(Substr(line.rest,2),1);Return;COMMAND12:;/* 001 - First line from a new server (or should be) */;Do loop=1 To Words(uchans);Drop lchan.loop;Drop ochan.loop;Drop fchan.loop;Drop wchan.loop;Drop bchan.loop;Drop tchan.loop;End;uchans="";nchans="";chanmax=0;'GetMyNick';znick=result;mnick=Upper(znick);"GetServerName";myserver=Upper(result);Return;COMMAND13:;/* 305 - UNAWAY */;meaway=0;metime=0;Return;COMMAND14:;/* 306 - AWAY */;meaway=1;metime=Time();Return;COMMAND15:;/* End of Names reply */;tmp=line.dest' 'line.rest;Parse Upper Value tmp With junk '#'tmpchan ':'tmp;tmpchan='#'tmpchan;clist=Find(uchans,tmpchan);If clist~=0&fchan.clist=0 Then;Do;/* 'echo p=test Number of users on channel 'tmpchan' = 'Words(lchan.clist) */;fchan.clist=1;tot=0;Do loop=1 To chanmax;If fchan.loop Then tot=tot+1;End;If tot>=chanmax Then coms=Delword(coms,Words(coms));End;Return;COMMAND16:;/* Name reply, used to make channel nick lists */;/* now doesn't check bots+friends */;tmp=line.dest' 'line.rest;Parse Upper Value tmp With junk '#'tmpchan ':'tmp;tmpchan='#'tmpchan;tmp=Compress(tmp,'+');clist=Find(uchans,tmpchan);nptmp='';If clist~=0&fchan.clist=0 Then;Do;Do nploop=1 To Words(tmp);npnick=Word(tmp,nploop);If Left(npnick,1)='@' Then;Do;npop=1;npnick=Delstr(npnick,1,1);End;Else npop=0;bum=Find(lchan.clist,npnick);If bum=0 Then;Do;ochan.clist=ochan.clist||npop;nptmp=nptmp npnick;End;Else ochan.clist=Overlay(npop,ochan.clist,bum);End;lchan.clist=lchan.clist nptmp;nploop=Words(nptmp);wchan.clist=wchan.clist||Copies('0',nploop);tchan.clist=tchan.clist||Copies('0',nploop);bchan.clist=bchan.clist||Copies('0',nploop);End;Return;MASTER1:;/* Main User Quit */;notdone=0;Return;MASTER2:;/* Debug Info */;opts=Strip(opts);tmp=Value(opts);If Upper(opts)~=Upper(tmp) Then 'Echo 'dfxname'DEBUG: 'opts' - 'tmp;Else 'Echo 'dfxname'DEBUG: 'opts' - No Such Variable!';Return;MASTER3:;/* Config Reload Command */;Call CONFIG_SETUP();If Upper(Strip(opts))~="QUIET" Then 'Echo 'dfxname' 'dwarfx' Config Reloaded!';Return;CTCPMSG6:;/* CTCP VERSION QUERY */;Call SEND(unick,4,'VERSION 'dwarfx znick' is running 'dfxver);Return;CTCPMSG7:;/* CTCP SOURCE QUERY */;Call SEND(unick,4,'SOURCE 'dwarfx' You can get the latest version of 'dwarfx' for AmIRC from 'dfxweb' ('dwarfx' Web Site)');Return;CTCPMSG8:;/* CTCP CLIENTINFO QUERY */;Call SEND(unick,4,'CLIENINFO 'dwarfx' 'bold2||ourctcp||bold2);Return;CTCPMSG9:;/* CTCP DCC QUERY */;If c_autodcc=0&c_soundmode~=3 Then Return;Parse Value misc With tmp tmp1 junkip junkport tmp2 .;If tmp~="SEND"&tmp~="MOVE" Then Return;autos=GetClip('DFxAS.'envnum);tmp3=Find(autos,Upper(tmp1));If c_soundmode=3&tmp3~=0 Then Setclip('DFxAS.'envnum,Strip(Delword(autos,tmp3,1)));Else If c_autodcc=0 Then Return;If TEST_DCC()>=c_dccspeed Then Return;If tmp3=0 Then;Do;tmp=c_dccdrawer||tmp1;tmp2=c_dccmax-tmp2;End;Else;Do;tmp=c_drawer||tmp1;tmp2=c_soundmax-tmp2;End;tmp3="";Do While Exists(tmp||tmp3);If tmp3="" Then;Do;tmp3=1;tmp=tmp'.';End;Else tmp3=tmp3+1;End;If Sign(tmp2)~=-1 Then 'Say /DCC GET 'nnick' 'tmp1' 'tmp||tmp3;Return;TEST_DCC:;w=Showlist('W') Showlist('T');p=1;n=0;Do Until p=0;n=n+1;p=Pos('AmIRC DCC R',w,p+21);End;Return n-1;CTCPMSG10:;/* CTCP SOUND QUERY (first word of misc=soundname) */;/* if not found then if auto get sound, then message for it */;fname=c_drawer||word(misc,1);If Exists(fname) Then;Do;If c_sounds=1 Then Address Command 'Run >NIL: 'c_player' 'fname;End;Else;Do;misc=Word(misc,1);Select;When c_soundmode=1 Then Call SEND(unick,4,'ERRMSG SOUND 'dwarfx' :'misc' doesn'quote't exist!');When c_soundmode=2 Then 'Echo 'dfxname||bold2||nnick||bold2' requested sound 'bold2||misc||bold2' which doesn'quote't exist!';When c_soundmode=3 Then;Do;Call SEND(unick,2,'GETSOUND 'misc);Setclip('DFxAS.'envnum,Getclip('DFxAS.'envnum)' 'Upper(misc));If (c_getplay=1)&(c_sounds=1) Then Address Command 'Run >NIL: Rx 'drawer'DWaRFPLaY.DWaRFx 'c_player' 'fname;End;Otherwise;End;End;Return;CTCPMSG11:;/* CTCP GETSOUND QUERY (first word of misc=soundname) */;If c_autosend=1 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFSoUNd.DWaRFx 'envadr' 'unick' 'c_drawer' 'Word(misc,1);Else Call SEND(nnick,4,'ERRMSG GETSOUND 'dwarfx' :'znick' has autosend turned off.');Return;CTCPMSG12:;/* CTCP ERRMSG QUERY (bounce back misc with a okay message) */;Call SEND(unick,4,'ERRMSG 'dwarfx' 'misc' :Message Returned.');Return;CTCPMSG13:;/* CTCP PAGE QUERY (Page using c_pagersound if were away - meaway=1) */;If meaway=0|c_awaypager=0 Then Return;If c_awaypager=2 Then;Do;tmp2=Find(uchans,Upper(zchannel));If tmp2=0 Then;Do;tmp3=2;Do loop=1 to chanmax;tmp2=Find(lchan.loop,unick);If tmp2~=0 Then;Do;If Substr(tchan.loop,tmp2,1)=0 Then Call TEST_USER(loop,tmp2);tmp3=Substr(bchan.loop,tmp2,1);End;End;If tmp3=2 Then tmp3=CHK_FRIEND(nnick);End;Else;Do;tmp3=Find(lchan.clist,unick);If Substr(tchan.loop,tmp2,1)=0 Then Call TEST_USER(clist,tmp3);tmp3=Substr(bchan.tmp2,tmp3,1);If tmp3>3 Then tmp3=tmp3-4;tmp3=tmp3>0;End;If tmp3=0 Then;Do;Call SEND(unick,4,'ERRMSG PAGE 'dwarfx' :Sorry, you aren t authorised to Page.');Return;End;End;Call SEND(unick,4,'PAGE 'dwarfx' Paging...');Address Command 'Run >NIL: 'c_player' 'c_pagesound;"Echo p="bold1"«DFx_Page» You have been paged by "bold2||unick;Return;CTCPMSG14:;/* CTCP XDCC QUERY (file server) misc=command */;If c_xmode=0 Then;Do;Call SEND(unick,4,'ERRMSG XDCC 'dwarfx' :Sorry, XDCC is currently disabled.');Return;End;tmp2=Find(uchans,Upper(zchannel));tmp3=0;isfr=0;isop=0;If tmp2=0 Then;Do;Do loop=1 to chanmax;tmp2=Find(lchan.loop,unick);If tmp2~=0 Then;Do;tmp3=1;If Substr(tchan.loop,tmp2,1)=0 Then Call TEST_USER(loop,tmp2);If isfr=0 Then isfr=Substr(bchan.loop,tmp2,1);If isop=0 Then isop=Substr(ochan.loop,tmp2,1);End;End;If tmp3=0 Then isfr=CHK_FRIEND(nnick);End;Else;Do;tmp3=Find(lchan.tmp2,unick);If Substr(tchan.tmp2,tmp3,1)=0 Then Call TEST_USER(tmp2,tmp3);isfr=Substr(bchan.tmp2,tmp3,1);isop=Substr(ochan.tmp2,tmp3,1);End;If isfr>3 Then isfr=isfr-4;If c_xmode=2&isfr=0 Then;Do;Call SEND(unick,4,'ERRMSG XDCC 'dwarfx' :Sorry, you aren t authorised for XDCC.');'Echo 'dfxname||bold2'«XDCC»'bold2' unauthorised access attempt by 'unick;Return;End;If c_xmode=3&isop=0 Then;Do;Call SEND(unick,4,'ERRMSG XDCC 'dwarfx' :Sorry, you aren t authorised for XDCC.');'Echo 'dfxname||bold2'«XDCC»'bold2' unauthorised access attempt by 'unick;Return;End;xcomm=Upper(Word(misc,1));misc=SubWord(misc,2);If isfr=0 Then tmp3=5;Else tmp3=6;Select;When xcomm="SEND"|xcomm="MOVE" Then;Do;pack=Word(misc,1);If Left(pack,1)='#' Then pack=Substr(pack,2);If pack=''|pack<0 Then;Do;Call SEND(unick,4,'ERRMSG XDCC 'dwarfx' :Sorry, that pack doesn t exist. Try /ctcp 'znick' XDCC HELP');'Echo 'dfxname||bold2'«XDCC»'bold2' Invalid pack send request by 'unick;End;Else Address Command 'Run >NIL: Rx 'drawer'DWaRFSXDCC.DWaRFx 'envadr pack isfr unick;End;When xcomm="LIST" Then Address Command 'Run >NIL: Rx 'drawer'DWaRFLXDCC.DWaRFx 'envadr' 'tmp3' 0 'unick;Otherwise;Do;'Echo 'dfxname||bold2'«XDCC»'bold2' Help requested by 'unick;Call SEND(unick,4,'XDCC 'dwarfx' 'bold2'XDCC'bold2' HELP Commands are as follows:');Call SEND(unick,4,'XDCC 'dwarfx' 'bold2'LIST'bold2' - List packs on offer');Call SEND(unick,4,'XDCC 'dwarfx' 'bold2'SEND #[PACK]'bold2' - Request pack #[PACK]');Call SEND(unick,4,'XDCC 'dwarfx' 'bold2'HELP'bold2' - Displays XDCC HELP');End;End;Return;CTCPMSG15:;/* Requested for a game of minidrop */;If c_minidrop>0 Then Address Command 'Run >NIL: Rx 'drawer'DWaRFMDRoP.DWaRFx 'envadr unick c_minidrop misc;Return;CHECK_NICK:;nloop=1;nkick=0;tmp=Words(c_words);Do wloop=1 To tmp;xwrd=Word(c_words,wloop);nkick=Pos(xwrd,unick);If nkick>0 Then Leave;End;If nkick>0 Then;Do;If c_wordmode=1 Then Call KICK(unick,"",swearnick);Else Call KICK_BAN(unick,"",swearnick);End;Return;AUTO_FRIEND:;nfound=CHK_FRIEND(nnick);if nfound=0 Then Return;tmp1=Word(c_ops.nfound,2);note="";clist=Find(uchans,Upper(zchannel));If clist=0 Then Return;tmp2=Find(lchan.clist,unick);If c_autoop>0&Left(tmp1,1)='O' Then;Do;bchan.clist=Overlay('3',bchan.clist,tmp2);If OP(nnick,zchannel)=1 Then note="Op'ed";End;Else bchan.clist=Overlay('1',bchan.clist,tmp2);If CHK_BOT(unick)=1 Then;Do;tmp3=Substr(bchan.clist,tmp2,1)+4;bchan.clist=Overlay(tmp3,bchan.clist,tmp2);End;If Right(tmp1,1)='M' Then;Do;Call GREET(nnick,zchannel);If tmp2>0 Then If note~="" Then note=note" And Greeted";Else note="Greeted";End;If note~="" Then note="("ohost") Has been "note"!";Else note="("ohost") Has arrived!";"Echo P="bold1"«DFx_Friend» "bold2||nnick||bold2" "note;Return;TEST_USER:;/* check the user in the channel list and position supplied */;Parse Arg tulist,tupos;tunick=Word(lchan.tulist,tupos);tufound=CHK_FRIEND(tunick);If tufound>0 Then;Do;If CHK_BOT(tunick)=1 Then;Do;If Left(Word(c_ops.tufound,2),1)~='O' Then bchan.tulist=Overlay('5',bchan.tulist,tupos);Else bchan.tulist=Overlay('7',bchan.tulist,tupos);End;Else;Do;If Left(Word(c_ops.tufound,2),1)~='O' Then bchan.tulist=Overlay('1',bchan.tulist,tupos);Else bchan.tulist=Overlay('3',bchan.tulist,tupos);End;End;Else;Do;If CHK_BOT(tunick)=1 Then bchan.tulist=Overlay('4',bchan.tulist,tupos);Else bchan.tulist=Overlay('0',bchan.tulist,tupos);End;tchan.tulist=Overlay('1',tchan.tulist,tupos);Return;CHK_FRIEND:;Parse Upper Arg chknick;'Userhost 'chknick;ohost=result;nhost=chknick'!'Upper(ohost)'.';Do chlp=1 To Words(c_opsaddr);cht2=Translate(Word(c_opsaddr,chlp),' ','*')'.';cht3=1;Do chln=1 To Words(cht2);cht3=Pos(Word(cht2,chln),nhost,cht3);If cht3=0 Then Leave;End;If cht3~=0 Then Leave;End;If cht3=0 Then Return(0);Return(chlp);CHK_BOT:;Parse Upper Arg chknick;'Userhost 'chknick;ohost=result;nhost=chknick'!'Upper(ohost)'.';Do chlp=1 To Words(c_bots);cht2=Translate(Word(c_bots,chlp),' ','*')'.';cht3=1;Do chln=1 To Words(cht2);cht3=Pos(Word(cht2,chln),nhost,cht3);If cht3=0 Then Leave;End;If cht3~=0 Then Leave;End;If cht3=0 Then Return(0);Return(1);GREET:;Parse Arg knick,kchan;kopt=Word(c_ops.nfound,3);kmess=MPARSE(Subword(c_ops.nfound,4));If Left(kopt,1)='C' Then tmp1=kchan;Else tmp1=knick;tmp2=Pos(Right(kopt,1),'MAN');If tmp2>0 Then Call MSEND(tmp1,tmp2,kmess);Return;CHAN_GREET:;Parse Arg cgnick,cgchan,cgreet;cgtmp=Random(1,c_greets.cgreet.0);kopt=Word(c_greets.cgreet.cgtmp,1);kmess=MPARSE(Subword(c_greets.cgreet.cgtmp,2));If Left(kopt,1)='C' Then tmp1=cgchan;Else tmp1=cgnick;tmp2=Pos(Right(kopt,1),'MAN');If tmp2>0 Then;Do;Call MSEND(tmp1,tmp2,kmess);"Echo P="bold1"«DFx_Greet» "bold2||nnick||bold2" Has been greeted!";End;Return;CHAN_MSG:;Parse Arg cmnum,cmchan;cmdid=0;Call Delay(10);Do cmtmp=1 To c_joinmsg.cmnum.0;cmmess=c_joinserver.cmnum.cmtmp;If (cmmess="")|(cmmess=myserver) Then;Do;cmtype=Word(c_joinmsg.cmnum.cmtmp,1);cmmess=MPARSE(Subword(c_joinmsg.cmnum.cmtmp,2));cmtype=Pos(Right(cmtype,1),'MAN');If cmtype>0 Then;Do;Call MSEND(cmchan,cmtype,cmmess);cmdid=1;End;End;End;If cmdid=1 then "Echo P="bold1"«DFx_Join» Auto message(s) sent on joining "bold2||cmchan||bold2"!";Return;MPARSE:;Parse Arg mmess;/* now parse all config '/' commands left and replace in mmess */;tmp=Pos('/',mmess);Do While tmp>0;tmp2=Upper(Substr(mmess,tmp+1,1));Select;When tmp2="/" Then mnew="/";When tmp2="P" Then mnew=nnick;When tmp2="T" Then mnew=Date('W')' 'Date()' 'Time();When tmp2="N" Then mnew=znick;When tmp2="D" Then Call CALC_IDLE();Otherwise mnew="";End;mmess=Insert(mnew,Delstr(mmess,tmp,2),tmp-1);tmp=Pos('/',mmess,tmp+length(mnew));End;If Right(mmess,2)~=ecode Then mmess=mmess||ecode;Return mmess;CALC_IDLE:;mnew=Getclip('DFxTIME.'envnum);If mnew~="" Then;Do;mnew=GETDELAY(mnew);mnew="DWaRFx Idle "mnew;End;Else mnew="<DWaRFx Idle time not available>";Return;GETDELAY:;Parse Arg oldh':'oldm':'olds;Parse Value Time() With newh':'newm':'news;If news<olds Then;Do;news=news+60;newm=newm-1;End;If newm<oldm Then;Do;newm=newm+60;newh=newh-1;End;If newh<oldh Then newh=newh+24;mnew="";news=news-olds;newm=newm-oldm;newh=newh-oldh;If newh>0 Then If newh=1 Then mnew="1 Hour ";Else mnew=newh" Hours ";If newm>0|newh>0 Then If newm=1 Then mnew=mnew||"1 Minute ";Else mnew=mnew||newm" Minutes ";If news>0|newm>0|newh>0 Then If news=1 Then mnew=mnew||"1 Second";Else mnew=mnew||news" Seconds";Return(mnew);MSEND:;Parse Arg sdest,stype,smess;stmp1=Pos(scanc,smess);oldstype=stype;Do While stmp1~=0;stmp2=Substr(smess,stmp1+1,1);Select;When stmp2=0 Then;Do;/* End Code */;stmp3=Left(smess,stmp1-1);smess=Substr(smess,stmp1+2);Select;When stype=1 Then 'RAW PRIVMSG 'sdest' :'stmp3;When stype=2 Then 'RAW PRIVMSG 'sdest' :'ctcp||stmp3||ctcp;When stype=3 Then 'RAW NOTICE 'sdest' :'stmp3;When stype=4 Then 'RAW NOTICE 'sdest' :'ctcp||stmp3||ctcp;When stype=5 Then;Do;'Say 'stmp3;stype=oldstype;End;Otherwise;End;End;When stmp2=1 Then;Do;/* Sound Code */;stmp3=c2d(Substr(smess,stmp1+2,1));If stmp3~=0 Then;Do;sname=Substr(smess,stmp1+3,stmp3);If sname~="" Then 'RAW PRIVMSG 'sdest' :'ctcp||'SOUND 'sname' ('sname')'ctcp;End;smess=Delstr(smess,stmp1,stmp3+3);End;When stmp2=2 Then;Do;/* Channel Code */;stmp3=Word(nchans,Find(uchans,Upper(zchannel)));smess=Insert(stmp3,Delstr(smess,stmp1,2),stmp1-1);End;When stmp2=3 Then;Do;/* DCC Send Code */;stmp3=c2d(Substr(smess,stmp1+2,1));If stmp3~=0 Then;Do;sname=Substr(smess,stmp1+3,stmp3);If sname~="" Then 'SAY /DCC SEND 'sdest' 'sname;End;smess=Delstr(smess,stmp1,stmp3+3);End;When stmp2=4 Then;Do;stype=5;smess=Delstr(smess,stmp1,2);End;When stmp2=5 Then;Do;/* CTCP QUERY WORD */;stmp3=c2d(Substr(smess,stmp1+2,1));If stmp3~=0 Then;Do;stmp4=Substr(smess,stmp1+3,stmp3);smess=Insert(Word(misc,stmp4),smess,stmp1+stmp3+2);End;smess=Delstr(smess,stmp1,stmp3+3);End;When stmp2=6 Then;Do;/* CTCP QUERY WORDS */;stmp3=c2d(Substr(smess,stmp1+2,1));If stmp3~=0 Then;Do;stmp4=Substr(smess,stmp1+3,stmp3);smess=Insert(SubWord(misc,stmp4),smess,stmp1+stmp3+2);End;smess=Delstr(smess,stmp1,stmp3+3);End;Otherwise;smess=Delstr(smess,stmp1,1);End;stmp1=Pos(scanc,smess);End;Return;SEND:;Parse Arg sdest,stype,smess;Select;When stype=1 Then 'RAW PRIVMSG 'sdest' :'smess;When stype=2 Then 'RAW PRIVMSG 'sdest' :'ctcp||smess||ctcp;When stype=3 Then 'RAW NOTICE 'sdest' :'smess;When stype=4 Then 'RAW NOTICE 'sdest' :'ctcp||smess||ctcp;Otherwise;End;Return;OP:;Parse Arg knick,kchan;kchan=Upper(kchan);tmp=Find(c_opchan,kchan);If c_autoop~=1 Then If (tmp=0&c_autoop=2)|(tmp~=0&c_autoop=3) Then Return 0;clist=Find(uchans,kchan);If Left(ochan.clist,1)='0' Then Return 0;'RAW MODE 'kchan' +o :'knick;Return 1;KICK:;Parse Arg knick,kchan,kreason;If kchan="" Then;Do;Do loop=1 To chanmax;aktmp=Find(lchan.loop,knick);If aktmp~=0&Left(ochan.loop,1)='1' Then;Do;If Substr(tchan.loop,aktmp,1)=0 Then Call TEST_USER(loop,aktmp);If Substr(bchan.loop,aktmp,1)>3 Then Return;ktmp=Word(uchans,loop);kchan=Find(c_wordchan,ktmp);If (kchan~=0&c_wordkick=2)|(kchan=0&c_wordkick=3)|c_wordkick=1 Then 'RAW KICK 'ktmp' 'knick' :'kreason;End;End;End;Else;Do;loop=Find(uchans,Upper(kchan));ktmp=Find(lchan.loop,knick);If Substr(tchan.loop,ktmp,1)=0 Then Call TEST_USER(loop,ktmp);If Substr(bchan.loop,ktmp,1)>3 Then Return;If loop~=0&Left(ochan.loop,1)='1' Then 'RAW KICK 'kchan' 'knick' :'kreason;End;Return;KICK_BAN:;Parse Arg knick,kchan,kreason;khost=GET_HOST(knick);If kchan="" Then;Do;kchan=Upper(kchan);Do loop=1 To chanmax;aktmp=Find(lchan.loop,knick);If aktmp~=0&Left(ochan.loop,1)='1' Then;Do;If Substr(tchan.loop,aktmp,1)=0 Then Call TEST_USER(loop,aktmp);If Substr(bchan.loop,aktmp,1)>3 Then Return;ktmp=Word(uchans,loop);kchan=Find(c_wordchan,ktmp);If (kchan~=0&c_wordkick=2)|(kchan=0&c_wordkick=3) Then;Do;'RAW MODE 'ktmp' +b 'khost;'RAW KICK 'ktmp' 'knick' :'kreason;End;End;End;End;Else;Do;loop=Find(uchans,Upper(kchan));ktmp=Find(lchan.loop,knick);If Substr(tchan.loop,ktmp,1)=0 Then Call TEST_USER(loop,ktmp);If Substr(bchan.loop,ktmp,1)>3 Then Return;If loop~=0&Left(ochan.loop,1)='1' Then;Do;'RAW MODE 'kchan' +b 'khost;'RAW KICK 'kchan' 'knick' :'kreason;End;End;Return;GET_HOST:;Parse Arg ghnick;'Userhost 'ghnick;Parse Value result With ghname'@'ghhost;If DataType(Compress(ghhost,'.'))='NUM' Then Return '*!'ghname'@'ghhost;Return '*!'ghname'@'||Space(Translate(ghhost,hostout,hostin),1,'*');KILL_CHANNEL:;Parse Arg kchan;uchans=Strip(Delword(uchans,kchan,1));nchans=Strip(Delword(nchans,kchan,1));If kchan=chanmax Then chanmax=chanmax-1;Else;Do;chanmax=chanmax-1;Do loop=kchan to chanmax;tmp=loop+1;lchan.loop=lchan.tmp;ochan.loop=ochan.tmp;bchan.loop=bchan.tmp;fchan.loop=fchan.tmp;wchan.loop=wchan.tmp;gchan.loop=gchan.tmp;tchan.loop=tchan.tmp;End;End;Return;SYNTAX:;If Show('P',envadr)=1 Then;Do;'Echo 'dfxname||dwarfx' ARexx Error 'rc' ('errortext(rc)') detected on Source Line 'sigl'!';'Echo 'dfxname||dwarfx' Will attempt to continue, but you may have to quit and reload 'dwarfx' if it isn'quote't working properly!';/*  Call SetClip('DFx.'envnum) - leave alone (TESTING PURPOSES) */;End;Else notdone=0;Return;REMOVE:;If Show('P',envadr)=1 Then 'Echo 'dfxname||dwarfx' has Quit!';Call CLEAR_DFX;Return;CLEAR_DFX:;Do loop=0 To 10;Call Setclip('ELINE.'loop);End;Call Setclip('ALINE.1');Call Setclip('ALINE.2');Call Setclip('DFx.'envnum);If Exists('Ram:DFx-Say') Then Address Command 'Delete >NIL: Ram:DFx-Say';Return;ERR:;Parse Arg errno;temp=dfxname||bold2'Error: 'bold2;Select;When errno=1 Then 'Echo 'temp' 'dwarfx' is already running on AmIRC.'envnum'!';When errno=2 Then 'Echo 'temp'Can'd2c(39)'t find file 'confname'!';Otherwise;End;Call CLEAR_DFX;Exit;Return;SETUP:;Parse Source . . drawer .;tmp=Pos('/',drawer);If tmp=0 Then tmp=Pos(':',drawer);Else tmp=Lastpos('/',drawer);drawer=Left(drawer,tmp);bold1=d2c(27)"x";bold2=d2c(2);host="AMIRC.";hostlen=Length(host);dwarfx=bold2'|DWaRFx-TNG|'bold2;dfxname='P='bold1'«|DWaRFx|» ';confname=drawer||"DWaRFCoNFiG.DaT";scan='A9'x||'AE'x||'A4'x||'['||'01'x||'%!@';coms='332 TOPIC PRIVMSG NOTICE JOIN NICK QUIT PART KICK MODE INVITE 001';coms=coms' 305 306 366';mycoms='QUIT DEBUG RELOAD';ctcp='01'x;inverse='i';underline='_';scanc='80'x;xcode=scanc'4';dcode=scanc'3';ccode=scanc'2';scode=scanc'1';ecode=scanc'0';wcode=scanc'5';lcode=scanc'6';mainctcp='USERINFO TIME ECHO PING ACTION VERSION SOURCE CLIENTNFO DCC';ourctcp='SOUND GETSOUND ERRMSG PAGE XDCC MINIDROP';mainctcp=mainctcp' 'ourctcp;swearword=dwarfx' - Swear word kick!';swearnick=dwarfx' - Obscene nick kick!';dfxweb='http://www.users.globalnet.co.uk/~gazy/';dfxver=dwarfx' v2.6 - By Gareth Murfin & David Newton';tmp=Random(,,Time(S));hostin="1234567890";hostout="          ";quote="'";meaway=0;metime=0;urlpos="HTTP://";Return;FIND_PORT:;ports=Show('P');envadr="";tmp=Pos(host,ports);If tmp>0 Then ports=Substr(ports,tmp);Else ports="";Do While envadr=""&ports~="";Parse Value ports With tmp ports;If Left(tmp,hostlen)=host Then;Do;If Getclip('DFx.'Substr(tmp,hostlen+1))="" Then envadr=tmp;End;End;Return;NICKLIST:;'Channels';tmp=result;If tmp~="" Then;Do;'Echo 'dfxname' 'dwarfx' Will send and receive some IRC Server Commands, Please Ignore them!';chanmax=Words(tmp);uchans="";nchans="";If Word(coms,Words(coms))~='353' Then coms=coms' 353';Do loop=1 To chanmax;Parse Value tmp With tmpchan tmp;'RAW NAMES :'tmpchan;nchans=nchans' 'tmpchan;uchans=uchans' 'Upper(tmpchan);lchan.loop=mnick;ochan.loop='0';fchan.loop=0;wchan.loop='0';bchan.loop='7';tchan.loop=1;jctmp=Find(c_gchans,Upper(tmpchan));If c_greets.jctmp.0~=0 Then gchan.chanmax=jctmp;Else gchan.chanmax=-1;jctmp=Find(c_gdchans,Upper(tmpchan));gdchan.chanmax=c_gdactive.jctmp;/* gchan.loop=SCAN_GREET(tmpchan) */;End;End;Else;Do;chanmax=0;uchans="";nchans="";End;Return;CONFIG_SETUP:;Call GET_CONFIG();Call GET_DATA();If c_speak~=0 Then;Do;If c_say="" Then sayname='c:say';Else sayname=c_say;If Exists(sayname) Then;Do;tmp=sayname;sayname='Ram:DFx-say';Address Command 'Copy >nil: 'tmp sayname;End;Else sayname='say';End;If c_urlcatch=1|c_urlcatch=3 Then;Do;If ~Exists(c_urlfile) Then;Do;Call Open(URL,c_urlfile,W);Call Close(URL);End;Call Open(URL,c_urlfile,A);End;If c_awaylog=1 Then;Do;If ~Exists(c_logfile) Then;Do;Call Open(LOG,c_logfile,W);Call Close(LOG);End;Call Open(LOG,c_logfile,A);Call SetClip('DFxAWAYLOG.'envnum,Y);End;Else Call Setclip('DFxAWAYLOG.'envnum);If c_kicklog=1 Then;Do;If ~Exists(c_kickfile) Then;Do;Call Open(KCK,c_kickfile,W);Call Close(KCK);End;Call Open(KCK,c_kickfile,A);End;If c_awaypager=1 Then Call SetClip('DFxAWAYPAGER.'envnum,'Y');If c_awaypager=2 Then Call SetClip('DFxAWAYPAGER.'envnum,'F');Call SetClip('DFxBOTS.'envnum,c_bots);Call SetClip('DFxXDCCFILE.'envnum,c_xfile);Call SetClip('DFxXDCCSLOT.'envnum,c_xslots);Call SetClip('DFxXDCCMODE.'envnum,c_xmode);Call SetClip('DFxXDCCKICK.'envnum,c_xkick);Call SetClip('DFxXDCCSNAG.'envnum,0);If chanmax>0 Then;Do;Do loop=1 To chanmax;tmpchan=Word(uchans,loop);jctmp=Find(c_gchans,tmpchan);If c_greets.jctmp.0~=0 Then gchan.loop=jctmp;Else gchan.loop=-1;jctmp=Find(c_gdchans,tmpchan);gdchan.loop=c_gdactive.jctmp;Do csloop=1 To Words(lchan.loop);xnick=Word(lchan.loop,csloop);nfound=CHK_FRIEND(xnick);If nfound~=0 Then;Do;tmp1=Word(c_ops.nfound,2);If Left(tmp1,1)='O' Then bchan.loop=Overlay('3',bchan.loop,csloop);Else bchan.loop=Overlay('1',bchan.loop,csloop);End;Else bchan.loop=Overlay('0',bchan.loop,csloop);If CHK_BOT(xnick)=1 Then;Do;tmp3=Substr(bchan.loop,csloop,1)+4;bchan.loop=Overlay(tmp3,bchan.loop,csloop);End;tchan.loop=Overlay('1',tchan.loop,csloop);End;End;End;Return;CONFIG_REMOVE:;If c_speak~=0 Then;Do;If Exists('Ram:DFx-say') Then Call Delete('Ram:DFx-say');End;If c_urlcatch=1|c_urlcatch=3 Then Call Close(URL);If c_awaylog=1 Then Call Close(LOG);If c_kicklog=1 Then Call Close(KCK);Call SetClip('DFxAWAYLOG.'envnum);Call SetClip('DFxAWAYPAGER.'envnum);Call SetClip('DFxXDCCFILE.'envnum);Call SetClip('DFxXDCCSLOT.'envnum);Call SetClip('DFxXDCCMODE.'envnum);Call SetClip('DFxXDCCKICK.'envnum);Call SetClip('DFxXDCCSNAG.'envnum);Return;GET_DATA:;atable.1='? ZYXWVUTSRQPONMLKJIHGFEDCBA-0987654321}{][)($#@!,:.';Call SetClip("ALINE.1",atable.1);etable.10=X2C(E7CFEEC2F3CEC1C7C0C3DBEACAFEDDF5E1E5FDFCE0FBD6CCE4F1EFF2);etable.10=etable.10||X2C(B6A4AFA5B0AEBFBAAAF7ACECDEA6C8A7D0E6DFF0B7B1F8B5);Call SetClip("ELINE.10",etable.10);tmp=1;If ~Open('file1',drawer||'MCF.Encrypt') Then;Do;If ~Open('file1','AmIRC:Rexx/DWaRFx/MCF.Encrypt') Then;Do;If ~Open('file1','MCF:MCF.Encrypt') Then;Do;'Echo 'dfxname' 'd2c(2)'MCF.Encrypt'd2c(2)' not found! (See DWaRFx Docs!)';'Echo 'dfxname'If you do not install this file, 'd2c(2)'|DWaRFx|'d2c(2)' will be unable to Encode/Decode MCF encrypted messages!';Do loop=0 To 9;etable.loop="";End;atable.2="";tmp=0;End;End;End;If tmp=0 Then Return;ln=Readln('file1');atable.2=Readln('file1');Call Setclip("ALINE.2",atable.2);Do loop=0 To 9;etable.loop=Readln('file1');Setclip("ELINE."loop,etable.loop);End;Call Close('file1');Return;GET_CONFIG:;c_select=1 /* Select CTCP Line 1=Random 2=Ordered */;c_join=0 /* Auto Join on INVITE 1=Yes, 0=No */;c_maxjoin=4 /* auto join if on less channels than this number */;c_autoop=0 /* Auto Op 0=Never, 1=Always, 2=Selected, 3=Excluded */;c_wordkick=0 /* Word Kick 0=Never, 1=Always, 2=Selected, 3=Excluded */;c_wordmode=1 /* Word Mode 1=Kick, 2=Kick and Ban */;c_wordwarn=3 /* number of warnings before swear kick */;c_deop=0 /* Deop warned nick 0=no, 1=yes */;c_soundmode=0 /* 0=Nothing, 1=notify sender, 2=notify you, 3=request sound */;c_speak=0 /* 0=No speech, 1=@ Speech, 2=Always */;c_autosend=0 /* 0=Don't AutoSend, 1=AutoSend */;c_sounds=0 /* 0=Don't play sound requests, 1=play sound requests */;c_dccmax=0 /* maximum autodcc get file size */;c_autodcc=0 /* 0=Don't auto accept dcc's, 1=auto accept dcc's */;c_dccspeed=6 /* maximum number of dcc gets running at any one time */;c_urlcatch=0 /* 0=nothing, 1=log, 2=send, 3=log and send */;c_awaypager=0 /* 0 don't, 1=yes, 2=friends only */;c_awaylog=0 /* 0 off, 1=on */;c_xmode=0 /* XDCC ACCESS MODE 0=Deny, 1=Normal, 2=Friends, 3=Ops */;c_xkick=0 /* XDCC ACCESS DENIED KICK 0=No, 1=Yes */;c_xslots=0 /* Maximum number of XDCC transfer slots */;c_protect=0 /* REop, deoped friends?? 1=No, 1=Yes */;c_revenge=0 /* Revenge deoped friends?? 0=No, 1=Yes, 2=Not friends */;c_kicklog=0 /* log kicks against us?? 0=No, 1=Yes */;c_getplay=0 /* play an autogot sound?? 0=No, 1=Yes */;c_protflood=0 /* flood protection?? 0=No, 1=Yes */;c_guardm=0 /* Channel guard?? 0=Off, 1=friends only, 2=me only */;c_guardt=0 /* channel guard type?? 0=Off, 1=Deop Non-Friends, 2=Deop */;c_protclock=20 /* flood protection clock value */;c_silence=0 /* Attempt to server silence the flooder?? */;c_minidrop=0 /* number of minidrop games to run maximum */;c_opsaddr="";c_gchans="";c_ops.1="";c_urlfile="";c_urlport="";c_urlcomm="";c_greets.1.1="";c_greets.1.0=0;c_ctcpcom="";c_ctcpnum.1=0;c_ctcp.1.1="";c_ctcpnxt.1=1;c_mykey="";c_drawer="";c_player="";c_wordchan="";c_xfile="";c_opchan="";c_words="";c_say="";c_dccdrawer="";c_logfile="";c_pagesound="";c_bots="";c_kickfile="";c_joinchans="";c_protflood=0;c_protctcp=20;c_protpriv=20;c_protchan=20;c_protnick=10;c_protclone=5;c_joinmsg.0.0=0;c_greets.0.0=0;c_gdactive.0=0;c_gdchans="";If ~Open('File1',confname,'R') Then Call ERR(2);opttmp="";Do While ~Eof('File1');ln=Strip(Readln('File1'));If Left(ln,1)="!" Then;Do;opttmp=Word(ln,1);ln=Readln('File1');loop=1;End;If Left(ln,1)=";" Then Iterate;Select;When opttmp="!OPTIONS:" Then Call CONFIG_OPTIONS;When opttmp="!FRIENDS:" Then Call CONFIG_PARSE(1);When opttmp="!OP-CHANNELS:" Then Call CONFIG_PARSE(2);When opttmp="!GREETS:" Then Call CONFIG_PARSE(3);When opttmp="!WORDS:" Then Call CONFIG_PARSE(4);When opttmp="!WORD-CHANNELS:" Then Call CONFIG_PARSE(5);When opttmp="!BOTS:" Then Call CONFIG_PARSE(6);When opttmp="!JOIN-MESSAGE:" Then Call CONFIG_PARSE(7);When opttmp="!GUARD-CHANNELS:" Then Call CONFIG_PARSE(8);When opttmp="!CTCP:" Then Call CTCP_PARSE;Otherwise;End;End;Call Close('File1');Return;CONFIG_OPTIONS:;If Left(ln,1)="$" Then;Do;Parse Value ln With '$'ln'='tmp junk;ln=Strip(Upper(ln));junk=tmp;tmp=Strip(Upper(tmp));Select;When ln='SPEECH' Then;Do;Select;When tmp='@' Then c_speak=1;When tmp='A' Then c_speak=2;Otherwise c_speak=0;End;End;When ln='SELECT' Then;Do;If tmp='R' Then c_select=1;Else c_select=2;End;When ln='WORDMODE' Then;Do;If tmp='B' Then c_wordmode=2;Else c_wordmode=1;End;When ln='REVENGE' Then;Do;Select;When tmp='Y' Then c_revenge=1;When tmp='F' Then c_revenge=2;Otherwise c_revenge=0;End;End;When ln='GUARDMODE' Then;Do;Select;When tmp='B' Then c_guardm=1;When tmp='H' Then c_guardm=2;Otherwise c_guardm=0;End;End;When ln='GUARDTYPE' Then;Do;Select;When tmp='F' Then c_guardt=1;When tmp='D' Then c_guardt=2;Otherwise c_guardt=0;End;End;When ln='KEY' Then c_mykey=junk;When ln='FLOODSILENCE' Then c_silence=YESNO();When ln='FLOODPROTECTION' Then c_protflood=YESNO();When ln='FLOODCTCP' Then c_protctcp=junk;When ln='FLOODPRIV' Then c_protpriv=junk;When ln='FLOODCHAN' Then c_protchan=junk;When ln='FLOODNICK' Then c_protnick=junk;When ln='FLOODCLONE' Then c_protclone=junk;When ln='FLOODCLOCK' Then c_protclock=junk;When ln='MINIDROP' Then c_minidrop=junk;When ln='SOUNDGETPLAY' Then c_getplay=YESNO();When ln='KICKLOG' Then c_kicklog=YESNO();When ln='KICKFILE' Then c_kickfile=junk;When ln='PROTECT' Then c_protect=YESNO();When ln='SOUNDS' Then c_sounds=YESNO();When ln='SPEECHPATH' Then c_say=junk;When ln='DCCMAX' Then c_dccmax=junk;When ln='DCCSPEED' Then c_dccspeed=junk;When ln='DCCDRAWER' Then c_dccdrawer=GETPATH();When ln='AWAYLOG' Then c_awaylog=YESNO();When ln='LOGFILE' Then c_logfile=junk;When ln='PAGESOUND' Then c_pagesound=junk;When ln='URLFILE' Then c_urlfile=junk;When ln='XDCCFILE' Then c_xfile=junk;When ln='XDCCKICK' Then c_xkick=YESNO();When ln='XDCCSLOTS' Then c_xslots=junk;When ln='XDCCMODE' Then;Do;Select;When tmp='D' Then c_xmode=0;When tmp='N' Then c_xmode=1;When tmp='F' Then c_xmode=2;When tmp='O' Then c_xmode=3;Otherwise;End;End;When ln='AWAYPAGER' Then;Do;Select;When tmp='Y' Then c_awaypager=1;When tmp='F' Then c_awaypager=2;Otherwise c_awaypager=0;End;End;When ln='URLCATCH' Then;Do;Select;When tmp='L' Then c_urlcatch=1;When tmp='S' Then c_urlcatch=2;When tmp='LS' Then c_urlcatch=3;Otherwise c_urlcatch=0;End;End;When ln='URLSEND' Then;Do;Select;When tmp='AMOSAIC' Then;Do;c_urlport='AMOSAIC.1';c_urlcomm="JUMP URL";End;When tmp='IBROWSE' Then;Do;c_urlport='IBROWSE';c_urlcomm="GOTOURL";End;When tmp='AWEB' Then;Do;c_urlport='AWEB.1';c_urlcomm="OPEN";End;When tmp='VOYAGER' Then;Do;c_urlport='VOYAGER';c_urlcomm="OPENURL";End;Otherwise;End;End;When ln='SOUNDMODE' Then;Do;Select;When tmp='S' Then c_soundmode=1;When tmp='Y' Then c_soundmode=2;When tmp='G' Then c_soundmode=3;Otherwise c_soundmode=0;End;End;When ln='MAXJOIN' Then c_maxjoin=junk;When ln='SOUNDPLAYER' Then c_player=junk;When ln='SOUNDMAX' Then c_soundmax=junk;When ln='SOUNDDRAWER' Then c_drawer=GETPATH();When ln='AUTOOP' Then Call CONFIG_OPT(1);When ln='WORDKICK' Then Call CONFIG_OPT(2);When ln='AUTOSEND' Then c_autosend=YESNO();When ln='AUTOJOIN' Then c_join=YESNO();When ln='AUTODCC' Then c_autodcc=YESNO();When ln='WARNDEOP' Then c_deop=YESNO();When ln='WORDWARN' Then;Do;If junk<0 Then junk=0;If junk>9 Then junk=9;c_wordwarn=junk;End;Otherwise;End;End;Return;YESNO:;Select;When tmp='Y' Then num=1;Otherwise num=0;End;Return num;GETPATH:;If Right(junk,1)~=':'&Right(junk,1)~='/' Then junk=junk'/';Return junk;CONFIG_OPT:;Parse Arg pick;Select;When tmp='N' Then num=0;When tmp='A' Then num=1;When tmp='S' Then num=2;When tmp='E' Then num=3;Otherwise;End;Select;When pick=1 Then c_autoop=num;When pick=2 Then c_wordkick=num;Otherwise;End;Return;CONFIG_PARSE:;Parse Arg tmp;If ln~="" Then;Do;Select;When tmp=1 Then;Do;c_opsaddr=c_opsaddr' 'Upper(Word(ln,1));c_ops.loop=Upper(Subword(ln,2,3))' 'PREPARSE(Subword(ln,5));End;When tmp=2 Then c_opchan=c_opchan' 'Upper(ln);When tmp=3 Then;Do;junk=Find(c_gchans,Upper(Word(ln,1)));If (junk=0)&(Word(ln,1)~="#*") Then;Do;c_gchans=c_gchans' 'Upper(Word(ln,1));junk=Words(c_gchans);c_greets.junk.0=0;End;num=c_greets.junk.0+1;c_greets.junk.0=num;c_greets.junk.num=Upper(Word(ln,2))' 'PREPARSE(Subword(ln,3));End;When tmp=4 Then c_words=c_words' 'Upper(ln);When tmp=5 Then c_wordchan=c_wordchan' 'Upper(ln);When tmp=6 Then c_bots=c_bots' 'Upper(ln);When tmp=7 Then;Do;junk=Upper(Word(ln,1));If junk~="#*" Then;Do;num=Find(c_joinchans,junk);If num=0 Then;Do;c_joinchans=c_joinchans' 'junk;num=Words(c_joinchans);c_joinmsg.num.0=0;End;End;Else num=0;junk=Subword(ln,2);junk1=c_joinmsg.num.0+1;c_joinmsg.num.0=junk1;If Left(junk,1)="$" Then;Do;c_joinserver.num.junk1=Substr(Upper(Word(junk,1)),2);junk=Subword(junk,2);End;Else c_joinserver.num.junk1="";c_joinmsg.num.junk1=Upper(Word(junk,1))' 'PREPARSE(Subword(junk,2));End;When tmp=8 Then;Do;Do junk=1 To Words(ln);If Word(ln,junk)~="#*" Then;Do;c_gdchans=c_gdchans' 'Upper(Word(ln,junk));num=Words(c_gdchans);c_gdactive.num=1;End;Else c_gdactive.0=1;End;End;Otherwise;End;loop=loop+1;Select;When tmp=1 Then c_ops.loop="";Otherwise;End;End;Return;CTCP_PARSE:;If ln~="" Then;Do;If Left(ln,1)="&" Then;Do;If loop=1 Then c_ctcpcom="";c_ctcpcom=c_ctcpcom||Upper(Strip(Substr(ln,2),'B'))' ';loop2=1;c_ctcp.loop.loop2="";c_ctcpnum.loop=0;c_ctcpnxt.loop=1;loop=loop+1;End;Else;Do;tmp=loop-1;tmp2=Upper(ln);If word(c_ctcpcom,tmp)="CLIENTINFO" Then;Do;If Find(tmp2,'ERRMSG')=0 Then ln='ERRMSG 'ln;If Find(tmp2,'GETSOUND')=0 Then ln='GETSOUND 'ln;If Find(tmp2,'SOUND')=0 Then ln='SOUND 'ln;End;c_ctcp.tmp.loop2=PREPARSE(ln);c_ctcpnum.tmp=c_ctcpnum.tmp+1;loop2=loop2+1;End;End;Return;PREPARSE:;Parse Arg mmess;tmp3=Pos('/',mmess);Do While tmp3>0;tmp2=Upper(Substr(mmess,tmp3+1,1));Select;When tmp2="B" Then mnew=bold2;When tmp2="I" Then mnew=inverse;When tmp2="U" Then mnew=underline;When tmp2="V" Then mnew=dfxver;When tmp2="W" Then mnew=dfxweb;When tmp2="L" Then mnew=dwarfx;When tmp2="E" Then mnew=ecode;When tmp2="S" Then;Do;mnew=scode;tmp2="()";End;When tmp2="C" Then mnew=ccode;When tmp2="$" Then;Do;mnew=dcode;tmp2="()";End;When tmp2="@" Then;Do;mnew=wcode;tmp2="()";End;When tmp2="*" Then;Do;mnew=lcode;tmp2="()";End;When tmp2="X" Then;Do;If tmp3>1 Then;Do;If Left(mmess,tmp3-1)~="" Then mnew=ecode||xcode;Else mnew=xcode;End;Else mnew=xcode;End;Otherwise mnew="/"tmp2;End;mmess=Insert(mnew,Delstr(mmess,tmp3,2),tmp3-1);If tmp2="()" Then;Do;tramp=Pos('(',mmess,tmp3);tart=Pos(')',mmess,tramp);If tramp~=0&tart~=0 Then;Do;bum=Pos('/',mmess,tramp);bumcount=1;Do While bum~=0&bum<tart;mmess=insert('/',mmess,bum);bum=Pos('/',mmess,bum+2);tart=tart+1;bumcount=bumcount+1;End;mmess=Delstr(mmess,tart,1);mmess=Delstr(mmess,tmp3+2,tramp-tmp3-1);tramp=tmp3+2;tramp=tart-tramp;mmess=Insert(d2c(tramp-bumcount),mmess,tmp3+1);End;Else mmess=Insert(d2c(0),mmess,tmp3+1);tmp3=tart;End;Else tmp3=tmp3+Length(mnew);tmp3=Pos('/',mmess,tmp3);End;If Right(mmess,2)~=ecode Then mmess=mmess||ecode;Return mmess